package controller.gui;

import errors.DimensionNotAcceptableException;
import gui.SecondaryMenu;

import java.awt.event.ActionEvent;

import javax.swing.JButton;

import advance.GameMap;

import controller.Controller;
import controller.NullStaticObjectException;



/**rappresenta il pulsante di conferma di ogni pannello secondario. Un pannello
 * secondario rappresenta un particolare ambito di modifica: fintanto che si modificano
 * i parametri del pannello secondario le modifiche non si ripercuotono sulla vera mappa;
 * tali modifiche sono quindi <strong>temporanee</strong>. Nel momento in cui pero' l'utente
 * da l'OK a tali modifiche, esse devono diventare <strong>persistenti</strong>. Questo
 * pulsante rappresenta quindi il ponte tra "modifico ma non sono sicuro se poi queste
 * medifiche vanno bene" a "confermo le mie modifiche".
 * 
 * <p>2 sono i metodi importanti di questa classe: {@link #isParametersCorrect()} permette 
 * di concludere il wizard iniziato da un PrimaryMenuButton. {@link #executeOtherInstruction(ActionEvent)} invece
 * consente di eseguire altre istruzioni oltre a quelle di default: quando infatti il pulsante viene premuto viene
 * eseguito il metodo {@link #isParametersCorrect()}; se esso ritorna true il secondarymenu viene nascosto, lo stato utente
 * viene portato a <tt>IDLE</tt> e vengono eseguite le istruzioni in {@link #executeOtherInstruction(ActionEvent)}.
 * 
 * @author Koldar
 * @version 1.4
 *
 */
public abstract class OKButtonController<PANEL extends SecondaryMenu> extends MetaSecondaryMenuButtonController<PANEL>{
	
	/**costurisce il nuovo controllore senza impostare il parametro <tt>superPanel</tt>
	 * 
	 */
	public OKButtonController(JButton button,PANEL  secondaryPanel){
		super(button,secondaryPanel);
	}
	
	

	/**rileva i parametri introdotti nei vari componenti del SecondaryMenu, quindi
	 * attua le modifiche alla mappa; infine nasconde il SecondaryMenu
	 * @throws DimensionNotAcceptableException in caso vengano inseriti dei valori non conformi ai dati richiesti dalla mappa
	 * 
	 */
	@Override
	public void wizardInizializer(ActionEvent arg0)throws NullStaticObjectException, DimensionNotAcceptableException {
		//rilevazione parametri introdotti E attuazione modifiche alla mappa
		if (this.isParametersCorrect()){
			this.executeOtherInstruction(arg0);
			//celazione del menu secondario
			this.superPanel.setVisible(false);
			//ripristino alla situazione di Idle
			this.setToIdle();
		}else{
			Controller.log.setText("the parameters aren't correct");
			//TODO mettere un dialogbox o qualcos'altro per dare errore!
		}
	}
	
	/**dopo aver premuto OK il software deve probabilmente leggere dei parametri.
	 * Tuttavia, prima di poterlo fare, deve assicurarsi che tali parametri siano compatibili
	 * con il dominio degli attributi stesso. Questo metodo verifica appunto se i parametri
	 * introdotti negli oggetti grafici del menu secondario sono applicabili o meno
	 * alla mappa.
	 * 
	 * @return TRUE se i parametri inseriti all'interno dei componenti grafici della vista sono
	 * compatibili con il dominio del parametro richiesto, FALSE altrimenti
	 */
	public abstract boolean isParametersCorrect();
	/**indica una (eventuale) serie di altre azioni oltre a quelle già performate, e cioé:
	 * <ul>
	 *  <li>conferma modifiche alla mappa</li>
	 *  <li>celazione del SecondaryMenu</li>
	 *  <li>impostazione allo stato di Idle</li>
	 * </ul>
	 * 
	 * di Default questo metodo non esegue nulla
	 * 
	 * @param arg0 l'evento passato dalla pressione del pulsante
	 */
	public void executeOtherInstruction(ActionEvent arg0){

	}
}
